package com.itheima.service.imlp;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.Mapper.DishMapper;
import com.itheima.dto.DishDto;
import com.itheima.entity.Dish;
import com.itheima.entity.DishFlavor;
import com.itheima.exection.DeleteByIdDishCustomExection;
import com.itheima.service.IDishService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

import java.util.stream.Collectors;

@Service
public class DishServiceImpl
        extends ServiceImpl<DishMapper, Dish>
        implements IDishService {


//    此处注入DishFlavor业务层的方法
    @Autowired
    private DishFlavorServiceImpl dishFlavorService;



    @Override
    public void saveWithFlavor(DishDto dishDto) {
//       此处对新增菜品进行处理
//        这一部分业务层比较特殊,需要处理菜品信息以及菜品口味
//        dish和dishFlavor是相对分开的

//        先处理菜品信息
        this.save(dishDto);
//        从菜品信息中拿出菜品ID
        Long dishId = dishDto.getId();

//        再从dishDto中拿出口味层的信息,对口味层中没有封装的内容进行处理
        List<DishFlavor> flavors = dishDto.getFlavors();
//        从前端传输的内容中可以了解到,口味层中,没有封装菜品的ID,这里需要对菜品ID进行封装处理
        flavors = flavors.stream().map((item) -> {
            item.setDishId(dishId);
            return item;
        }).collect(Collectors.toList());

//        由于菜品口味可能存在多表保存的情况,因此,这里存储的方法需要使用多表存储
        dishFlavorService.saveBatch(flavors);

    }


//    此处创建一个处理DTO的方法
    @Override
    public DishDto queryWithFlavor(Long id) {

//        先根据ID数值获取Dish的数据
        Dish dish = this.getById(id);

//        再根据ID获取DishFlavor的数据
//        先对ID进行处理,让DishFlavor知道,这个ID是dish的参数
        LambdaQueryWrapper<DishFlavor> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(id!=null,DishFlavor::getId,id);
        List<DishFlavor> dishFlavor = dishFlavorService.list(wrapper);

//        将两个表合并为一个表,发送给表现层
//        获取DishDTO
        DishDto dishDto = new DishDto();
        BeanUtils.copyProperties(dish,dishDto);
        dishDto.setFlavors(dishFlavor);
        return dishDto;
    }


//
    @Override
    public void updateWithFlavor(DishDto dishDto) {

        /**
         * 思路:
         * 此处需要对两个表进行处理,可以考虑根据菜品ID来找到对应的数据
         * 考虑1:Dish表中菜品ID相对独立,一般一个ID配对一个数据,对于这一部分要修改的内容,可以按照传统方法操作
         * 考虑2:DishFlavor菜品口味表中,菜品ID就只是作为一个标记,一个ID可以匹配多个数据,而这多个数据的口味在数据库中也并不是非常重要
         *      多是一次性的操作,多元化操作,因此数据本身就不是那么严谨重要,可以采用删除后再新增一个数据的方法进行.避免出现,前端只需要一个数据
         *      但后端却保存3个数据的造成资源浪费的情况
         * 考虑3:对这两个表不需要返回前端结果,因此后端处理完毕后,不需要再次合并
         */

//        一,处理Dish表
        this.updateById(dishDto);
//        二,处理DishFlavor表
//        此处的操作需要进行条件判断
        LambdaQueryWrapper<DishFlavor> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(DishFlavor::getDishId,dishDto.getId());
        dishFlavorService.remove(wrapper);

//        三,新增DishFlavor表
//        前端传过来的内容中,不包含DishId内容,此处需要获取DishId
        Long dishId = dishDto.getId();
        List<DishFlavor> flavors = dishDto.getFlavors();
        List<DishFlavor> dishFlavorLish = flavors.stream().map((dishFlavor -> {
            dishFlavor.setDishId(dishId);
            return dishFlavor;
        })).collect(Collectors.toList());

        dishFlavorService.saveBatch(dishFlavorLish);
    }


//      接口六：删除菜品接口[和批量删除用的是同一个接口]
//      请求url地址：/dish    ?ids=1504708761831292929,1504653856504483842
//      请求方式：DELETE
//      请求参数：?ids=1504708761831292929,1504653856504483842
//      响应结果【格式统一】：R 对象
    @Override
    public void deleteWithFlavor(List<Long> ids) {
//        先判断售卖情况
        LambdaQueryWrapper<Dish> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Dish::getStatus,1).in(Dish::getId,ids);
        int count = this.count(wrapper);
        if (count>0){
            throw new DeleteByIdDishCustomExection("在售的菜品不能删除,请停售后再试");
        }

//        删除菜品表
        this.removeByIds(ids);

//        删除口味表
        LambdaQueryWrapper<DishFlavor> wrapperDishFlavor = new LambdaQueryWrapper<>();
        wrapperDishFlavor.in(DishFlavor::getDishId,ids);
        dishFlavorService.remove(wrapperDishFlavor);


    }

//      接口七：起售/停售 批量起售/批量停售
//      请求url地址：/dish/status/1  ?ids=1504708761831292929,1504653856504483842,1413384757047271425
//      请求方式：POST
//      请求参数：?ids=1504708761831292929,1504653856504483842,1413384757047271425
//      响应结果【格式统一】：R 对象

    @Override
    public void status(Integer dishStatus, List<Long> ids) {
//        主要针对Dish表处理
        LambdaUpdateWrapper<Dish> wrapper = new LambdaUpdateWrapper<>();
        wrapper.in(Dish::getId,ids);
        wrapper.set(Dish::getStatus,dishStatus);
        this.update(wrapper);
    }


}
